void GradOp5 (MaxGV, ImSize, InImage, DeltaX, DeltaY)
int  MaxGV, ImSize;
BYTE ** InImage;
int  ** DeltaX;
int  ** DeltaY;
{
   long  dXl, dYl;
   int   r,c, dX,dY, gv, y,x, MaxMag;

   static int Xmask [5][5] = { { -10, -10,  0,  10,  10},
                               { -17, -17,  0,  17,  17},
                               { -20, -20,  0,  20,  20},
                               { -17, -17,  0,  17,  17},
                               { -10, -10,  0,  10,  10} };
   static int Ymask [5][5] = { {  10,  17,  20,  17,  10},
                               {  10,  17,  20,  17,  10},
                               {   0,   0,   0,   0,   0},
                               { -10, -17, -20, -17, -10},
                               { -10, -17, -20, -17, -10} };

   for (r=0; r<ImSize; r++) {
      for (c=0; c<ImSize; c++) {
         DeltaX [r][c] = 0;
         DeltaY [r][c] = 0;
   }  }

   MaxMag = 0;
   for (r=2; r<ImSize-2; r++) {
      for (c=2; c<ImSize-2; c++) {
         dXl = 0;
         dYl = 0;
         for (y=-2; y<=2; y++) {
            for (x=-2; x<=2; x++) {
               gv = InImage [r+y] [c+x];
               dXl += (gv * Xmask [y+2] [x+2]);
               dYl += (gv * Ymask [y+2] [x+2]);
         }  }
         dX = (int) (dXl/25);
         dY = (int) (dYl/25);
         if (abs(dX) > MaxMag)  MaxMag = abs(dX);
         if (abs(dY) > MaxMag)  MaxMag = abs(dY);
         DeltaX [r][c] = dX;
         DeltaY [r][c] = dY;
   }  }

   for (r=0; r<ImSize; r++) {
      for (c=0; c<ImSize; c++) {
         DeltaX [r][c] = (int) (((long) DeltaX [r][c] * MaxGV) / MaxMag);
         DeltaY [r][c] = (int) (((long) DeltaY [r][c] * MaxGV) / MaxMag);
}  }  }
